#!/bin/bash

##################################Variables###########################################

# Declaración de variables que se van a usar para leer del archivo de conf (L de local)
L_GRUPO=""
L_CONFDIR=""
L_BINDIR=""
L_MAEDIR=""
L_ARRIDIR=""
L_ACEPDIR=""
L_RECHDIR=""
L_REPODIR=""
L_PROCDIR=""
L_LOGDIR=""
L_LOGEXT=""
L_LOGSIZE=""
L_DATASIZE=""

#Arrays para chequear faltantes de componentes
declare -a MAES=("salas.mae" "obras.mae")
declare -a COMANDOS=("Recibir_B" "Reservar_B" "Mover_B" "Imprimir_B" "Stop_D" "Start_D" "ValidarFecha" "ValidarHora") #Grabar_L se chequea aparte

#Array de las variables que voy a leer del archivo de configuración
declare -a VARIABLESALEER=("GRUPO" "CONFDIR" "BINDIR" "MAEDIR" "ARRIDIR" "ACEPDIR" "RECHDIR" "REPODIR" "PROCDIR" "LOGDIR" "LOGEXT" "LOGSIZE" "DATASIZE")

#Array de las variables de ambiente que voy a setear y tengo que agregarles el path del grupo (las de log se setean antes)
declare -a VARIABLESDEAMBIENTEPATHS=("CONFDIR" "BINDIR" "MAEDIR" "ARRIDIR" "ACEPDIR" "RECHDIR" "REPODIR" "PROCDIR")

#Array de las variables de ambiente que voy a setear y no tengo que agregarles el path del grupo (las de log se setean antes)
declare -a VARIABLESDEAMBIENTENOPATHS=("GRUPO" "DATASIZE")

#Variables para setear permisos a los archivos
PERMISOSCOMANDOS="555" #Lectura y ejecución
PERMISOSMAES="444" #Lectura
PERMISOSCFG="444" #Lectura
PERMISOSDIS="666" #Lectura y escritura

##################################################################################################################

# Se obtiene la ruta necesaria para llamar al script (desde donde se está ubicado)
BASE="$( cd "$( dirname "${BASH_SOURCE[0]}")" && pwd )"

# Path del directorio grupo06
GRUPO06_PATH=$(echo "$BASE" | sed "s,\(.*\)grupo06/.*,\1grupo06,")

# Path del archivo de configuración
PATH_ARCHIVO_CFG=$GRUPO06_PATH/conf/Instalar_TP.conf


###Función que avisa si hubo algún error en los pasos###
ERROR="0"
huboError()
{
	ERROR="1"
	return
}
#########################################################



###Función para chequear si existe el archivo de configuración###
chequearArchivoDeCfg()
{
	if ! [ -e "$PATH_ARCHIVO_CFG" ]
	then
		#No se puede loggear porque no tengo el config
		PUEDOLOGGEAR="0"
		echo "Archivo de configuración Instalar_TP.conf inexistente, reinstale el sistema."
		huboError
	else
		chmod $PERMISOSCFG "$PATH_ARCHIVO_CFG"
	fi
	return
}
###################################################################


###Función para loggear: si puedo loggear es 1 loggea el mensaje con el tipo indicado###
PUEDOLOGGEAR="1"
NOMBRESCRIPT="Iniciar_B"
loggear()
{
	if [ "${PUEDOLOGGEAR}" -eq "1" ]
		then
			bash "${L_GRUPO}/${L_BINDIR}/Grabar_L" "$NOMBRESCRIPT" "$1" "$2"
		fi	
	return
}
#########################################################################################


################Función para chequear si existe un archivo maestro.######################
MAE=""
chequearMae() 
{
	if ! [ -e "${L_GRUPO}/${L_MAEDIR}/$MAE" ]
	then
		LOGGEARMENSAJE="Falta archivo maestro: $MAE no está instalado."
		loggear "E" "$LOGGEARMENSAJE"
		echo "$LOGGEARMENSAJE"
		huboError
	else
		chmod $PERMISOSMAES "${L_GRUPO}/${L_MAEDIR}/$MAE"
	fi
	return
}
##########################################################################################


################Función para chequear si existe un comando.######################
COMANDO=""
chequearComando()
{
	if ! [ -e "${L_GRUPO}/${L_BINDIR}/$COMANDO" ]
	then
		LOGGEARMENSAJE="Falta archivo binario: $COMANDO no está instalado."
		loggear "E" "$LOGGEARMENSAJE"
		echo "$LOGGEARMENSAJE"
		huboError
	else
		chmod $PERMISOSCOMANDOS "${L_GRUPO}/${L_BINDIR}/$COMANDO"
	fi
	return
}
##########################################################################################


###Función que analiza si están instalados los comandos y archivos necesarios para el sistema###
analizarIntegridadDelSistema()
{
	if ! [ -e "${L_GRUPO}/${L_BINDIR}/Grabar_L" ]
	then
		echo "Falta archivo binario: Grabar_L no instalado."
		PUEDOLOGGEAR="0"
		huboError
	else
		chmod $PERMISOSCOMANDOS "${L_GRUPO}/${L_BINDIR}/Grabar_L"
		#Inicializo Log
		if ! [ $(env | grep -c "AMBIENTE_INICIALIZADO") -eq "1" ]
		then
			export LOGDIR="$L_GRUPO/${L_LOGDIR}"
			export LOGEXT=".${L_LOGEXT}"
			export LOGSIZE="${L_LOGSIZE}"
		fi
		loggear "I" "Inicio de ejecución."
	fi	
	
	#Chequear si están archivos maestros
	for i in ${MAES[@]}
	do
   		MAE=$i
		chequearMae
	done

	#Chequear si están los comandos
	for i in ${COMANDOS[@]}
	do
   		COMANDO=$i
		chequearComando
	done

	#Chequear si está el combos.dis
	if ! [ -e "${L_GRUPO}/${L_PROCDIR}/combos.dis" ]
	then
		LOGGEARMENSAJE="Falta archivo de disponibilidades: combos.dis no está instalado."
		loggear "E" "$LOGGEARMENSAJE"
		echo "$LOGGEARMENSAJE"
		huboError
	else
		chmod $PERMISOSDIS "${L_GRUPO}/${L_PROCDIR}/combos.dis"
	fi
	return
}
##########################################################################################


###Función que carga los valores de las variables desde el archivo de configuración###
cargarVariablesDesdeArchivo()
{
	
	for i in "${VARIABLESALEER[@]}"
	do
   		eval "L_$i"=$(grep "^$i" "$PATH_ARCHIVO_CFG" | sed 's/^.*=\(.*\)=.*=.*/\1/')
	done
	return
}
##########################################################################################


###Función que setea las variables de ambiente (si no había sido hecho antes)###
setearVariablesDeAmbiente()
{
	
	if ! [ $(env | grep -c "AMBIENTE_INICIALIZADO") -eq "1" ]
	then
		export AMBIENTE_INICIALIZADO="1"
		export PATH="${PATH}:${L_GRUPO}${L_BINDIR}"
		for i in ${VARIABLESDEAMBIENTEPATHS[@]}
		do
   			eval aux=\$$"L_$i"
			export $i="$L_GRUPO/$aux"
		done
		for i in ${VARIABLESDEAMBIENTENOPATHS[@]}
		do
   			eval aux=\$$"L_$i"
			export $i=$aux
		done		
		LOGGEARMENSAJE="Inicializando ambiente..."
		loggear "I" "$LOGGEARMENSAJE"
		echo "$LOGGEARMENSAJE"
	else
		LOGGEARMENSAJE="Ambiente ya inicializado, si quiere reiniciar termine su sesión e ingrese nuevamente."
		loggear "E" "$LOGGEARMENSAJE"
		echo "$LOGGEARMENSAJE"
		huboError
	fi
	return
}
##########################################################################################


###Función que muestra el estado actual del sistema y los valores de las variables de ambiente###
mostrarEstado()
{
	echo -e "\n-------------------------------------------------------------------
TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 06
Librería del Sistema: ${CONFDIR}"
	ls "${CONFDIR}"
	echo "Ejecutables: ${BINDIR}"
	ls "${BINDIR}"
	echo "Archivos maestros: ${MAEDIR}"
	ls "${MAEDIR}"
	echo "Directorio de arribo de archivos externos: ${ARRIDIR}
Archivos externos aceptados: ${ACEPDIR}
Archivos externos rechazados: ${RECHDIR}
Reportes de salida: ${REPODIR}
Archivos procesados: ${PROCDIR}
Logs de auditoria del Sistema: ${LOGDIR}/<comando>${LOGEXT}
Estado del Sistema. Inicializado"
#Si el demonio está corriendo muestro su pid
for ITERADOR_PID in $PID_DEMONIO
do
	echo "Demonio corriendo bajo el no.: $ITERADOR_PID"
done

echo -e "-------------------------------------------------------------------\n"
	return
}
##########################################################################################


########Permite activar el demonio si el usuario lo desea##########
PID_DEMONIO=""
DemonioCorriendo="1"
activarDemonio()
{

		echo "Desea efectuar la activación de Recibir_B? Si - No"
		local RESPUESTA=""
		local RESPUESTA_VALIDA="0"
		local NOMBRE_LANZADOR="Start_D"
		local NOMBRE_DEMONIO="Recibir_B"
		#Hago ciclo hasta que se ingrese Si o No
		while [ $RESPUESTA_VALIDA -eq "0" ]
		do
			read RESPUESTA
			if [ "$RESPUESTA" == "Si" ]
			then
				#Si el usuario quiere activar el demonio verifico si no está corriendo
				RESPUESTA_VALIDA="1"
				PID_DEMONIO=$(pgrep "$NOMBRE_DEMONIO")
				if [ -z $PID_DEMONIO ]
				then
					#Si no está corriendo lo activo
					bash "$BINDIR/$NOMBRE_LANZADOR" "$BINDIR/$NOMBRE_DEMONIO"
					PID_DEMONIO=$(pgrep "$NOMBRE_DEMONIO")
					LOGGEARMENSAJE="Activando el demonio Recibir_B."
					loggear "I" "$LOGGEARMENSAJE"
					echo "$LOGGEARMENSAJE"
				else
					#Si ya estaba corriendo no hago nada
					LOGGEARMENSAJE="El demonio no puede activarse porque ya que se encontraba corriendo. Utilice el comando 					Stop_D si desea detenerlo."
					loggear "E" "$LOGGEARMENSAJE"
					echo -e "\nEl demonio no puede activarse porque ya que se encontraba corriendo. Si desea detenerlo posiciónese en el directorio de binarios ($BINDIR) y ejecute el comando \"./Stop_D Recibir_B\""
				fi
			elif [ "$RESPUESTA" == "No" ]
			then
				#Si el usuario no quiere activar el demonio muestro instrucciones para hacerlo
				RESPUESTA_VALIDA="1"
				echo -e "\nEl demonio no ha sido activado, para activarlo manualmente posiciónese en el directorio de binarios($BINDIR) y ejecute el comando \"./Start_D ./Recibir_B\""
				DemonioCorriendo="0"
			else
				echo "Respuesta incorrecta, ingrese Si o No"
			fi
		done

	return
}
##########################################################################################


#Punto de inicio del script

#Si ingreso como parámetro -r, me limpia la inicialización hecha antes
if [ "$#" -eq "1" ]
then
	if [ "$1" = "-r" ]
	then
		unset AMBIENTE_INICIALIZADO
		return 2
	fi
fi

echo -e "\n* Inicio de ejecución de Iniciar_B."
#Chequeo si existe el archivo de configuración
chequearArchivoDeCfg

#Si existe el archivo de configuración analizo si hay faltantes de archivos
if [ "${ERROR}" -eq "0" ]
then
	
	cargarVariablesDesdeArchivo
	chmod $PERMISOSCOMANDOS "${L_GRUPO}/${L_BINDIR}/Iniciar_B"
	analizarIntegridadDelSistema
fi

#Si no se detectaron faltantes de archivos o comandos seteo variables de ambiente
if [ "${ERROR}" -eq "0" ]
then
	setearVariablesDeAmbiente
fi


#Si las variables de ambiente se inicializaron correctamente intento activar demonio y muestro estado
if  [ "${ERROR}" -eq "0" ]
then
	activarDemonio
	mostrarEstado
fi

#Cierro log (si lo abrí) y salgo
LOGGEARMENSAJE="Finalizando ejecución de Iniciar_B."
loggear "I" "$LOGGEARMENSAJE"
echo -e  "* $LOGGEARMENSAJE \n"
